package com.gxa.hualianeshop.controller;
import com.gxa.hualianeshop.common.base.R;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/** 远程调用
 * 1. UrlConnection - java
 * 2. HttpClient - apache
 * 3. RestTemplate - spring
 *
 * 上述三种类型都是Http请求的封装工具
 * http请求
 * 序列化的数据,请经过空参构造方法来进行 - jdk序列化方式
 * okHttp3 第三方插件
 *
 * RestTemplate: Spring提供的一种远程调用模板对象
 * 封装不同请求类型(post/get/put/delete) ,且不同请求数据类型(urlencode/ application/json)
 * 是否带有请求头
 *
 * 使用远程调用对服务进行了一次更深层次的解耦
 * 1. 优点: 重复的业务被集中定义在服务, 需要的时候远程调用即可
 * 2. 缺点:
 *  2.1设计架构的时候会存在冗余的代码(admin/empl-service)
 *  2.2 远程调用操作本身也比较繁琐
 *
 *  对外的端口暴露
 *  防火墙只开放8080端口, 而8000端口要保护起来只对内访问
 * @author bill
 * @date 2023/7/5 10:46
 */

@Slf4j
@RestController
@RequestMapping("/empl")
//@RequiresRoles({"system","manager"})
public class EmplController {

    @Autowired
    RestTemplate restTemplate;

    /**
     * 当admin再访问员工信息的时候, 向empl-service发起远程调用请求
     * @return
     */
    @GetMapping("/list")
    public R list(){

        //使用RestTemplate来实现远程调用
        // 目标: http://localhost:8000/empl/list
        // 参数: 无
        // 请求方式: get



        //getForObject: 返回自定义类型 T
        //getForEntity: 返回固定类型 ResponseEntity<T>

        String url = "http://localhost:8000/empl/list";
        List forObject = restTemplate.getForObject(url, List.class);
        log.info("远程调用获取的结果:{}",forObject);

        return R.ok(forObject);
    }


    @PostMapping("/login")
    @ApiOperation(value = "登录方法",notes = "{phone:13411111111,pwd:123456}")
    public R login(String phone, String pwd){
        // post远程调用方式

        String url = "http://localhost:8000/empl/login";

        // 处理参数部分
        MultiValueMap<String,Object> params =  new LinkedMultiValueMap<>();
        params.add("phone",phone);
        params.add("pwd",pwd);

        // 处理请求头部分
        /*MultiValueMap<String,Object> headers = new LinkedMultiValueMap<>();
        headers.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED);*/

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);


        HttpEntity httpEntity = new HttpEntity(params,headers);
        Object o = restTemplate.postForObject(url, httpEntity, Object.class);
        log.info("login返回的对象:{}",o);
        return R.ok(o);

    }

    @RequiresPermissions(value = {"system:dept"})
    @PostMapping("/dept")
    public R dept(){
        return R.ok();
    }

    @RequiresPermissions(value = {"system:add"})
    @PostMapping("/add")
    public R add(){
        return R.ok();
    }
}
